package com.github.anastasop.dropwizard.jedis.example.resources;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import com.google.common.base.Splitter;
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
public class TeamsServiceResource {
private static final String KEY_PREFIX = "teams:";
private static final String KEY_SEARCH = "teams:*";
private static final Splitter CSV_SPLITTER = Splitter.on(",").trimResults().omitEmptyStrings();
@Context
private UriInfo uriInfo;
@Context
private JedisPool pool;
private String keyFromTeamName(String teamName) {
return KEY_PREFIX + teamName;
}
private String nameFromTeamKey(String key) {
return key.substring(KEY_PREFIX.length());
}
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_HTML})
public Object getAllTeams(@HeaderParam("Accept") String mediaType) {
List<String> teams = new ArrayList<String>();
Jedis jedis = pool.getResource();
try {
List<String> teamsKeys = new ArrayList<String>(jedis.keys(KEY_SEARCH));
for (String key: teamsKeys) {
teams.add(nameFromTeamKey(key));
}
pool.returnResource(jedis);
} catch (Exception e) {
pool.returnBrokenResource(jedis);
throw e;
}
if (mediaType.equalsIgnoreCase(MediaType.APPLICATION_JSON)) {
return teams;
}
return new AllTeamsView(teams);
}
@GET
@Path("{name}")
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_HTML})
public Object getMembers(@HeaderParam("Accept") String mediaType, @PathParam("name") String teamName) {
List<String> members = null;
Jedis jedis = pool.getResource();
try {
if (jedis.exists(keyFromTeamName(teamName))) {
members = jedis.lrange(keyFromTeamName(teamName), 0, -1);
pool.returnResource(jedis);
} else {
return Response.status(Status.NOT_FOUND).build();
}
} catch (Exception e) {
pool.returnBrokenResource(jedis);
throw e;
}
if (mediaType.equalsIgnoreCase(MediaType.APPLICATION_JSON)) {
return members;
}
return new TeamView(teamName, members);
}
@POST
@Path("{name}")
@Consumes("text/plain")
public void addMembers(@PathParam("name") String teamName, String csvMembers) {
Jedis jedis = pool.getResource();
try {
for (String member: CSV_SPLITTER.split(csvMembers)) {
jedis.rpush(keyFromTeamName(teamName), member);
}
pool.returnResource(jedis);
} catch (Exception e) {
pool.returnBrokenResource(jedis);
throw e;
}
}
}